package com.kuang.pool;

import java.lang.reflect.Executable;
import java.util.concurrent.*;


//Executors 工具类 3大方法


public class Demo1 {
    public static void main(String[] args) {
        //自定义线程池


        //最大线程到底该如何定义
        //1.CPU密集型      (看CPU几核)?条线程同时执行  可以保持CPU效率最高
        //2.IO 密集型

        //获取CPU的核心数
        System.out.println(Runtime.getRuntime().availableProcessors());

        ExecutorService threadPool = new ThreadPoolExecutor(2,
                Runtime.getRuntime().availableProcessors(),//根据电脑自动分配核心大小  CPU密集型 调优
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),    //队列+最大值   3+5  如果超过就会抛异常
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy());//队列满了,尝试去和第一个竞争,不会抛弃异常

        try {
            for (int i = 0; i <=10; i++) {
                //使用了线程池,就使用线程池来创建线程
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + " ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池用完后需要关闭线程池
            threadPool.shutdown();
        }


    }
}
